package main

import (
	"fmt"
	"math"
)

/**
函数也是值，他们可以像其他值一样传递，比如，函数值可以作为函数的参数或者返回值

Go函数可以是一个闭包，闭包是一个函数。
*/
func compute(fn func(float64, float64) float64) float64 {
	return fn(3, 4)
}

/**
函数adder是一个闭包函数，返回值类型是func(int) int
*/
func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

func main() {
	hypot := func(x, y float64) float64 {
		return math.Sqrt(x*x + y*y)
	}

	fmt.Println(compute(hypot))

	fmt.Printf("-------下面测试函数闭包")

	pos := adder()
	neg := adder()
	for i := 0; i < 10; i++ {
		fmt.Println(
			pos(i),
			neg(-2*i),
		)
	}

}
